package org.example.netty.common;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class MyDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        if (byteBuf.readableBytes() < 4){
            return;   //因为消息的长度是使用int类型存储的，即4个字节的长度数据，如果这里获取到的可读取长度没有4个字节，说明数据还不完整，返回等待后续数据
        }
        byteBuf.markReaderIndex();  //标记读取数据的起始位置

        int length = byteBuf.readInt();  //readInt()方法：返回当前readerIndex的int值，并将readerIndex的值增加4（增加4是因为前4为储存的是数据长度数据，不是数据本身，数据本身从第5位开始）
        if (byteBuf.readableBytes() < length){
            byteBuf.resetReaderIndex();  //判断可读取数据的长度和前面读取得到的数据长度值是否一致，如果可读取数据长度不够，说明数据未传输完成
            return;
        }

        byte[] contentBytes = new byte[length];
        byteBuf.readBytes(contentBytes);  //将当前ByteBuf中从当前readerIndex处开始的数据传送到一个目标ByteBuf或者byte[]

        MyMessage myMessage = new MyMessage(new String(contentBytes));
        list.add(myMessage);
    }
}
